package com.mryang.hds.controller;

import com.auth0.jwt.JWT;
import com.mryang.hds.configs.AppException;
import com.mryang.hds.entity.User;
import com.mryang.hds.service.ILoginService;
import com.mryang.hds.utils.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.util.HashMap;
import java.util.Map;

/**
 * @author Genius
 * @version 1.0.0
 * @ClassName LoginController.java
 * @Description TODO 登录控制器
 * @createTime 2022年12月25日 19:30:00
 */

@RequestMapping("/api")
@RestController
public class LoginController {

    @Resource
    private ILoginService iLoginService;

    @Resource
    private UploadMinio uploadMinio;

    /**
     * 用户登录
     * @param username
     * @param password
     * @return
     */
    @PostMapping("/login")
    public ResultJson Login(String username, String password){

        try{

            User loginUser = null;

            // 对用户输入密码进行加密，在与数据库中的密码进行比对
            password = Md5Util.encode(password);

            if (username.length() > 11){

                // 通过 idCard 登录
                loginUser = iLoginService.getLoginUser(username, password);
            }else{
                // 通过 phone 登录
                loginUser = iLoginService.getLoginUserByPhone(username, password);
            }

            // System.out.println(loginUser);

            // 通过用户名和密码无法查找到该用户
            if (loginUser == null){
                return ResultJson.error("用户名或密码错误");
            }

            //返回Token
            String token = JWTUtil.getToken(loginUser);

            return ResultJson.success(token,"用户登录成功");

        } catch (Exception e){
            throw new AppException(ResultCode.LOGIN_FAIL);
        }

    }


    /**
     * 用户注册
     * @param user 注册信息
     * @return 统一返回结果
     */
    @PostMapping("/register")
    public ResultJson Register(User user){
        // System.out.println(user);

        // 设置默认密码为身份证后6位
        String idCard = user.getIdCard();

        // 对用户注册 密码使用 MD5加密
        user.setPassword(Md5Util.encode(idCard.substring(idCard.length()-6)));

        int i = iLoginService.insertUser(user);

        if (i == 1){
            return ResultJson.success("注册成功！");
        }

        if (i == 0){
            return ResultJson.error("该用户已经注册过！请直接登录");
        }

        return ResultJson.error("用户注册失败");

    }


    /**
     * 上传图片到 minio
     * @param file 待上传的文件
     * @return 成功：返回图片名称；失败：返回失败信息
     */
    @PostMapping("/upload")
    public ResultJson uploadToMinio(@RequestParam("file") MultipartFile file,@RequestParam("filename") String filename){

        try {

            uploadMinio.upload(file,filename);

            return ResultJson.success("图片上传成功！");
        } catch (Exception e) {
            e.printStackTrace();
            throw new AppException(ResultCode.UPLOAD_OPERATION_FAILED);
        }

    }



    @GetMapping("/getStatus")
    public ResultJson getUserStatus(HttpServletRequest httpServletRequest){
        String token = httpServletRequest.getHeader("token");
        Integer tokenFlag = JWTUtil.getTokenFlag(token);
        return ResultJson.success(tokenFlag,"登录成功");
    }



}
